package com.example.yingjiguanli_demo.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;
@Slf4j
@Component
public class SessionManager {
    private static final String SESSION_PREFIX = "session:";
    private static final String USER_SESSION_PREFIX = "user:session:";
    private static final long SESSION_EXPIRATION = 7; // Session有效期（天）

    @Resource
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 创建新的Session，并关联用户ID。
     *
     * @param sessionId Session ID
     * @param username 用户名
     * @param userId 用户ID
     */
    public void createSession(String sessionId, String username, Long userId) {
        try {
            redisTemplate.opsForValue().set(SESSION_PREFIX + sessionId, username, SESSION_EXPIRATION, TimeUnit.DAYS);
            redisTemplate.opsForValue().set(USER_SESSION_PREFIX + userId, sessionId, SESSION_EXPIRATION, TimeUnit.DAYS);
            log.info("Session已成功存储在Redis中，Session ID: {}，用户: {}", sessionId, username);
        } catch (Exception e) {
            log.error("存储Session时发生错误，Session ID: {}，用户: {}", sessionId, username, e);
            // 可以根据需要抛出自定义异常或者返回错误信息
            throw new RuntimeException("存储Session时发生错误");
        }
    }


    /**
     * 根据Session ID获取用户名。
     *
     * @param sessionId Session ID
     * @return 用户名
     */
    public String getSession(String sessionId) {
        return (String) redisTemplate.opsForValue().get(SESSION_PREFIX + sessionId);
    }

    /**
     * 根据用户ID获取当前Session ID。
     *
     * @param userId 用户ID
     * @return 当前的Session ID
     */
    public String getSessionByUserId(Long userId) {
        return (String) redisTemplate.opsForValue().get(USER_SESSION_PREFIX + userId);
    }

    /**
     * 作废当前Session。
     *
     * @param sessionId Session ID
     */
    public void invalidateSession(String sessionId) {
        redisTemplate.delete(SESSION_PREFIX + sessionId);
    }

    /**
     * 根据用户ID作废当前用户的Session。
     *
     * @param userId 用户ID
     */
    public void invalidateSessionByUserId(Long userId) {
        String sessionId = getSessionByUserId(userId);
        if (sessionId != null) {
            invalidateSession(sessionId);
            redisTemplate.delete(USER_SESSION_PREFIX + userId);
        }
    }
}
